// 导入全局配置文件
import { globalConfig } from './config/index';
// 导入路由
import { userRouter } from './router/user/user';
import { menuRouter } from './router/menulist/menu';
import { workorderRouter } from './router/workorder/workorder';
import { myInfoRouter } from './router/myinfo/myinfo';
// 导入cors跨域中间件
import cors from 'cors';
// 导入express-jwt路由权限中间件
import { expressjwt } from 'express-jwt';
// 导入express
import express from 'express';
// 导入session
import session from 'express-session';

// 创建express实例
const app = express();

// 设置端口
const port: number = 5000;

/**
 * 挂载中间件
 * 1. 跨域中间件
 * 2. 权限验证中间件
 *      jsonwebtoken: 生成jwt的字符串
 *      jwt: 将客户端发送来的jwt字符串，解析成JSON对象的包
 * 3. 将用户信息存在session里面
 * 4. 解析请求体( body )的数据中间件
 * 5. 将判断是否在登录状态，不然就取消返回错误信息
 * 6. 挂载路由中间件
 */
// 1.
app.use(cors());

// 2.
app.use(expressjwt({ secret: globalConfig.jwtSecretKey, algorithms: ['HS256'] }).unless({ path: [/^\/api\//] }));

// 3.
app.use(session({
    secret: globalConfig.sessionSecretKey,   //负责对session加密
    resave: false, // 重新保存
    saveUninitialized: true,
    cookie: {
        maxAge: 1000 * 3600 * 24, // 时长
        secure: false // https则设置true
    }
}));

// 4.
app.use(express.urlencoded({ extended: false }));

// 6.
app.use('/api', userRouter);

// 5. 在api之后去调用这个中间件，监测是否登录
app.use(function (req: any, res, next) {
    //  判断用户是否已经在登录
    if (!req.session.isLogin) {
        return res.send({
            status: 1,
            message: '请重新登录！',
            data: null
        });
    }
    next();
});

// 6.继续挂载路由
app.use('/workorder', workorderRouter);
app.use('/menu', menuRouter);
app.use('/myinfo', myInfoRouter);


// 挂载错误中间件 -- 必须在路由挂载之后挂载

app.listen(port, () => console.log(`服务启动：http://127.0.0.1:${port}`));